import { onErrorCaptured } from 'vue'

// 1. 错误格式化
function formatError(error, source = 'unknown') {
  return {
    message: error.message || '未知错误',
    stack: error.stack || '无堆栈信息',
    source,
    time: new Date().toISOString()
  }
}

// 2. 错误上报
function reportError(errorInfo) {
  if (import.meta.env.PROD) {
    // 实际项目中替换为后端接口
    console.warn('【错误上报】', errorInfo)
  }
}

// 3. 组件内错误处理
function handleComponentError(error, instance, info, componentName) {
  const errorInfo = formatError(error, `${componentName} (${info})`)
  if (import.meta.env.DEV) {
    console.error(`【组件错误】${componentName}`, errorInfo)
  }
  reportError(errorInfo)
}

// 4. 组件错误捕获组合式函数
function useErrorHandler(componentName, preventPropagation = false) {
  onErrorCaptured((error, instance, info) => {
    handleComponentError(error, instance, info, componentName)
    return preventPropagation
  })
}

// 5. 全局错误处理配置
function setupGlobalErrorHandler(app) {
  // 全局错误捕获
  app.config.errorHandler = (error, instance, info) => {
    const errorInfo = formatError(error, `global (${info})`)
    console.error('【全局错误】', errorInfo)
    reportError(errorInfo)
  }

  // 未处理的Promise错误
  window.addEventListener('unhandledrejection', (event) => {
    const errorInfo = formatError(event.reason, 'unhandled promise')
    console.error('【未处理的Promise错误】', errorInfo)
    reportError(errorInfo)
    event.preventDefault()
  })
}

// 统一导出一个工具对象，包含所有方法
export const errorHandler = {
  format: formatError,          // 格式化错误
  report: reportError,          // 错误上报
  handleComponent: handleComponentError, // 组件错误处理
  use: useErrorHandler,         // 组件内使用的组合式函数（简化命名）
  setupGlobal: setupGlobalErrorHandler  // 全局错误配置
}

// 默认导出，方便导入
export default errorHandler
